package com.foreknow.Collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 泛型，JDK5.0以后推出的新特性
 */
public class GenericDemo01 {
    public static void main(String[] args) {
        /*
//        不使用泛型机制，分析程序存在缺点
        List list = new ArrayList();
//        准备对象
        Cat cat = new Cat();
        Bird bird = new Bird();
//        把对象添加到集合中去
        list.add(cat);
        list.add(bird);
//        遍历集合，取出cat让她抓老鼠，取出鸟儿让它飞
        Iterator it = list.iterator();
        while (it.hasNext()){
            //通过迭代器取出来的就是Object
            Object object = it.next();
            if (object instanceof Animal){
                Animal a = (Animal) object;
                a.move();
            }

        }
         */

//        使用泛型List<Animal>，表示List集合中只允许存储Animal类型的数据
//        存储其他了类型的数据会出错
        List<Animal> list = new ArrayList<>();
        Cat cat = new Cat();
        Bird bird = new Bird();
        list.add(cat);
        list.add(bird);
        //代表迭代器迭代的是Animal类型
        Iterator<Animal> it = list.iterator();
        while (it.hasNext()){
//            使用泛型之后，返回的都是你之前规定的list集合中的数据存储类型
            Animal a = it.next();
            a.move();
            //调用子类型的特有方法还是需要转型的
            if (a instanceof Cat){
                Cat c = (Cat) a;
                c.catchMouse();
            }
            if (a instanceof Bird){
                Bird b = (Bird) a;
                b.fly();
            }
        }
    }
}
class Animal{
    public void move(){
        System.out.println("动物要移动");
    }
}
class Cat extends Animal{
    public void catchMouse(){
        System.out.println("猫爪老鼠");
    }
}

class Bird extends Animal{
    public void fly(){
        System.out.println("鸟儿在飞翔");
    }
}
